3-20 128. 最长连续序列
Date:2022-03-20 07:45:57
标签:
哈希表
枚举x,找x+1,x+2,x+n最大可能,注意跳过x-1成立的元素,因为成立时,必有更长的串
题目:128. 最长连续序列 ( 中等😕 )
给定一个未排序的整数数组 nums
,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n)
的算法解决此问题。
示例
示例1:
输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。
示例2:
输入:nums = [0,3,7,2,5,8,4,6,0,1]
输出:9
分析
排序法
先排序,再找连续最大的序列,思路最简单,但时间复杂度为O(nlogn)(排序算法最小复杂度)
不满足题目O(n)时间复杂度要求
哈希表
枚举每一个值,并且在数组中找出所有满足x,x+1,x+2的最长序列
注意一个条件:如果当前元素-1存在,则跳过,因为从左向右遍历,如果x-1存在于哈希表中,那说明一定有更长的序列
时间复杂度O(n)
其他方法
还有动态规划、并查集等方法.https://leetcode-cn.com/problems/longest-consecutive-sequence/solution/xiao-bai-lang-ha-xi-ji-he-ha-xi-biao-don-j5a2/
题解
这里只看哈希表法
function longestConsecutive(nums: number[]): number {
const len = nums.length
let max = 0
const num_set = new Set<number>()
for (let i = 0; i < len; ++i) {
num_set.add(nums[i])
}
num_set.forEach((num) => {
if (num_set.has(num - 1)) {
return
}
let currentNum = num
let sum = 1 // include self, so it is 1
while (num_set.has(currentNum + 1)) {
++currentNum
++sum
}
max = Math.max(max, sum)
})
return max
}
使用
function main() {
// const nums = [100, 4, 200, 1, 3, 2]
// const nums = [0, 3, 7, 2, 5, 8, 4, 6, 0, 1]
const nums = [9, 1, 4, 7, 3, -1, 0, 5, 8, -1, 6]
console.log('[]:', longestConsecutive(nums))
}
main()
export {}